package com.starhub.base.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * Redis 使用示例类
 */
@Component
public class RedisExample {

    @Autowired
    private RedisUtil redisUtil;

    /**
     * 字符串操作示例
     */
    public void stringExample() {
        // 存储字符串
        redisUtil.set("string:key", "Hello Redis");
        
        // 存储字符串并设置过期时间（10分钟）
        redisUtil.set("string:key:expire", "This will expire in 10 minutes", 10, TimeUnit.MINUTES);
        
        // 获取字符串
        Object value = redisUtil.get("string:key");
        System.out.println("获取到的值：" + value);
        
        // 判断key是否存在
        Boolean exists = redisUtil.hasKey("string:key");
        System.out.println("key是否存在：" + exists);
        
        // 删除key
        redisUtil.delete("string:key");
    }

    /**
     * Hash操作示例
     */
    public void hashExample() {
        String key = "hash:user:1";
        
        // 存储单个字段
        redisUtil.hSet(key, "name", "张三");
        redisUtil.hSet(key, "age", 25);
        
        // 获取单个字段
        Object name = redisUtil.hGet(key, "name");
        System.out.println("用户名：" + name);
        
        // 存储整个对象
        Map<String, Object> userMap = new HashMap<>();
        userMap.put("name", "李四");
        userMap.put("age", 30);
        userMap.put("email", "lisi@example.com");
        redisUtil.hSetAll(key, userMap);
        
        // 获取整个对象
        Map<Object, Object> user = redisUtil.hGetAll(key);
        System.out.println("用户信息：" + user);
        
        // 判断字段是否存在
        Boolean hasField = redisUtil.hHasKey(key, "name");
        System.out.println("name字段是否存在：" + hasField);
        
        // 删除字段
        redisUtil.hDelete(key, "email");
    }

    /**
     * List操作示例
     */
    public void listExample() {
        String key = "list:items";
        
        // 添加单个元素
        redisUtil.lRightPush(key, "item1");
        
        // 批量添加元素
        redisUtil.lRightPushAll(key, "item2", "item3", "item4");
        
        // 获取列表范围
        List<Object> items = redisUtil.lRange(key, 0, -1);
        System.out.println("列表内容：" + items);
        
        // 获取列表长度
        Long size = redisUtil.lSize(key);
        System.out.println("列表长度：" + size);
        
        // 获取指定位置的元素
        Object item = redisUtil.lIndex(key, 1);
        System.out.println("第二个元素：" + item);
        
        // 删除元素
        redisUtil.lRemove(key, 1, "item2");
    }

    /**
     * Set操作示例
     */
    public void setExample() {
        String key = "set:tags";
        
        // 添加元素
        redisUtil.sAdd(key, "java", "python", "redis");
        
        // 判断元素是否存在
        Boolean exists = redisUtil.sIsMember(key, "java");
        System.out.println("java标签是否存在：" + exists);
        
        // 获取所有元素
        Set<Object> tags = redisUtil.sMembers(key);
        System.out.println("所有标签：" + tags);
        
        // 获取集合大小
        Long size = redisUtil.sSize(key);
        System.out.println("标签数量：" + size);
        
        // 删除元素
        redisUtil.sRemove(key, "python");
    }

    /**
     * 过期时间操作示例
     */
    public void expireExample() {
        String key = "expire:key";
        
        // 设置值
        redisUtil.set(key, "This is a test");
        
        // 设置过期时间（1小时）
        redisUtil.expire(key, 1, TimeUnit.HOURS);
        
        // 获取过期时间
        Long expireTime = redisUtil.getExpire(key, TimeUnit.MINUTES);
        System.out.println("剩余过期时间（分钟）：" + expireTime);
    }

    /**
     * 计数器操作示例
     */
    public void counterExample() {
        String key = "counter:visits";
        
        // 增加计数
        Long count = redisUtil.increment(key, 1);
        System.out.println("当前访问次数：" + count);
        
        // 减少计数
        count = redisUtil.decrement(key, 1);
        System.out.println("减少后的访问次数：" + count);
    }

    /**
     * 综合示例
     */
    public void comprehensiveExample() {
        // 用户会话管理
        String sessionKey = "session:user:123";
        Map<String, Object> sessionData = new HashMap<>();
        sessionData.put("userId", 123);
        sessionData.put("username", "张三");
        sessionData.put("lastLoginTime", System.currentTimeMillis());
        
        // 存储会话数据并设置过期时间（30分钟）
        redisUtil.hSetAll(sessionKey, sessionData);
        redisUtil.expire(sessionKey, 30, TimeUnit.MINUTES);
        
        // 用户访问记录
        String visitKey = "user:123:visits";
        redisUtil.lRightPush(visitKey, "访问页面A");
        redisUtil.lRightPush(visitKey, "访问页面B");
        redisUtil.expire(visitKey, 24, TimeUnit.HOURS);
        
        // 用户标签
        String tagsKey = "user:123:tags";
        redisUtil.sAdd(tagsKey, "VIP", "活跃用户", "新用户");
        
        // 获取用户信息
        Map<Object, Object> userInfo = redisUtil.hGetAll(sessionKey);
        List<Object> visitHistory = redisUtil.lRange(visitKey, 0, -1);
        Set<Object> userTags = redisUtil.sMembers(tagsKey);
        
        System.out.println("用户信息：" + userInfo);
        System.out.println("访问历史：" + visitHistory);
        System.out.println("用户标签：" + userTags);
    }
} 